// function createCurry(func, args) {
//     args = args || []
//     let len = func.length
//
//     return function() {
//         let _args = [].slice.call(arguments);
//         [].push.apply(_args, args)
//         if(_args.length < len) {
//             return createCurry(func, _args)
//         }
//         return func(..._args)
//     }
// }
//
// let add = (a, b, c) => a + b + c
//
// let c = createCurry(add)
// console.log(c(1)(2)(3))
//
//
//
// //无限柯里化函数
// //就是利用闭包不断将新增的arguments上传到_args中，更改toString方法
// function _add() {
//     let _args = [].slice.call(arguments)
//
//     function adder() {
//
//         function _adder() {
//             console.log(_args, arguments);  //_args 不能用箭头函数 否则这个arguments就是_add的arguments了
//             _args.push(...arguments)
//             return _adder
//         }
//         _adder.toString = function () {
//             return _args.reduce((a, b) => a + b)
//         }
//         return _adder
//     }
//     return adder(..._args)
// }
//
// console.log(_add(1)(2)(3, 4) + 10)
//


let curry = (fn) => {
    let args = []
    return function tmp(...news) {
        if(news.length) {
            args = [...args, ...news]
            return tmp
        } else {
            let result = fn.call(this, ...args)
            args = []
            return result
        }
    }
}

let add = curry((...args) => args.reduce((a, b) => a + b))
console.log(add(10)(20)())